package com.easy.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.easy.bean.Address;
import com.easy.bean.User;
import com.easy.common.CommonResult;
import com.easy.dao.IAddressDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("address")
public class AdressController {
    @Autowired
    private IAddressDao iAddressDao;

    //  将指定地址设置为默认地址
    @PutMapping("/updatedefault/{id}")
    public CommonResult setDefaultAddress(@PathVariable Integer id, @RequestParam Integer userId) {
        // 1. 将该用户的所有地址的 is_default 设置为 0
        UpdateWrapper<Address> resetWrapper = new UpdateWrapper<>();
        resetWrapper.eq("user_id", userId).set("is_default", 0);
        iAddressDao.update(null, resetWrapper);

        // 2. 将指定地址的 is_default 设置为 1
        UpdateWrapper<Address> setDefaultWrapper = new UpdateWrapper<>();
        setDefaultWrapper.eq("id", id).set("is_default", 1);
        int result = iAddressDao.update(null, setDefaultWrapper);

        // 判断更新是否成功
        if (result > 0) {
            return CommonResult.success("默认地址设置成功");
        } else {
            return CommonResult.fail("设置默认地址失败");
        }
    }

    // 1. 查询用户的所有地址
    @GetMapping("all/{userId}")
    public CommonResult getAddressByUserId(@PathVariable Integer userId) {
        QueryWrapper<Address> wrapper=new QueryWrapper<Address>();
        // 根据 userId 查询地址列表，并按照 is_default 降序，id 降序排序
        wrapper.eq("user_id", userId)
               .orderByDesc("is_default")  // 首先按 is_default 降序排列
               .orderByDesc("id");          // 然后按 id 降序排列

        // 根据 userId 查询地址列表
        List<Address> addresses = iAddressDao.selectList(wrapper);
        // 拼接省、市、区和详细地址，并将结果设置到 fullAddress 中
        for (Address address : addresses) {
            address.setFullAddress(address.getFullAddress());
        }
        // 如果查询结果不为空，返回成功响应，包含地址列表及总数
        if (addresses != null && !addresses.isEmpty()) {

            return CommonResult.success(addresses, addresses.size());
        } else {
            // 如果没有查询到结果，返回失败响应
            return CommonResult.fail("未找到该用户的地址信息");
        }
    }

    // 2. 查询用户的 默认地址
    @GetMapping("default/{userId}")
    public CommonResult getAddressDefaultByUserId(@PathVariable Integer userId) {
        QueryWrapper<Address> wrapper=new QueryWrapper<Address>();

        // 根据 userId 查询地址列表中 is_default 为 1 的记录
        wrapper.eq("user_id", userId)
                .eq("is_default", 1);  // 筛选 is_default 为 1 的记录

        // 查询默认地址
        Address defaultAddress = iAddressDao.selectOne(wrapper);

        // 如果查询结果不为空，返回成功响应
        if (defaultAddress != null) {
            defaultAddress.setFullAddress(defaultAddress.getFullAddress());
            return CommonResult.success(defaultAddress);
        } else {
            // 如果没有查询到结果，返回失败响应
            return CommonResult.fail("未找到默认地址");
        }
    }

    @PostMapping("add")
    public CommonResult addAddress(@RequestBody Address address) {
        // 查询用户是否已有地址记录
        QueryWrapper<Address> wrapper = new QueryWrapper<>();
        wrapper.eq("user_id", address.getUserId());

        Long addressCount = iAddressDao.selectCount(wrapper);

        // 如果用户没有地址，将当前地址设为默认地址
        if (addressCount == 0) {
            address.setIsDefault(1);
        }

        // 插入新的地址记录
        int result = iAddressDao.insert(address);

        // 如果插入成功，返回成功响应
        if (result > 0) {
            return CommonResult.success("地址添加成功");
        } else {
            // 如果插入失败，返回失败响应
            return CommonResult.fail("地址添加失败");
        }
    }


    // 4. 更新地址
    @PutMapping("update")
    public CommonResult updateAddress(@RequestBody Address address) {
        // 根据 ID 更新地址信息
        int result = iAddressDao.updateById(address);
        // 如果更新成功，返回成功响应
        if (result > 0) {
            return CommonResult.success("地址更新成功");
        } else {
            // 如果更新失败，返回失败响应
            return CommonResult.fail("地址更新失败");
        }
    }

    // 5. 删除地址
    @DeleteMapping("/{id}")
    public CommonResult deleteAddress(@PathVariable Integer id) {
        // 根据 ID 删除地址记录
        int result = iAddressDao.deleteById(id);
        // 如果删除成功，返回成功响应
        if (result > 0) {
            return CommonResult.success("地址删除成功");
        } else {
            // 如果删除失败，返回失败响应
            return CommonResult.fail("地址删除失败");
        }
    }

}
